// 云函数入口文件
const cloud = require('wx-server-sdk');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV // 使用当前环境ID
});

const db = cloud.database();
const $ = db.command.aggregate;

// 云函数入口函数
exports.main = async (event, context) => {
  const id = event.id; // 从调用云函数时传递的参数中获取id

  try {
    const result = await db.collection('exercises')
      .aggregate() // 开始聚合操作
      .match({
        belongChapter: id // 条件匹配：belongChapter字段等于传入的id
      })
      .lookup({
        from: 'class-copy', // 联表查询的集合
        localField: 'question_types', // exercises中用于联表的字段
        foreignField: '_id', // class-copy中用于联表的字段
        as: 'classInfo' // 查询结果的新字段名
      })
      .addFields({
        // 如果answer字段不存在或为空数组，添加一个包含空对象的数组以保持文档结构
        answerProcessed: {
          $ifNull: ["$answer", [{}]] // 使用$ifNull检查answer字段
        }
      })
      .unwind({
        path: '$answerProcessed',
        preserveNullAndEmptyArrays: true // 即使answer为空或不存在也保留文档
      })
      .lookup({
        from: 'answer-copy', // 联表查询的集合
        localField: 'answerProcessed',
        foreignField: '_id',
        as: 'answerDetails'
      })
      .unwind({
        path: '$answerDetails',
        preserveNullAndEmptyArrays: true // 即使无匹配的answerDetails也保留文档
      })
      .group({
        _id: '$_id',
        classInfo: { $first: '$classInfo' },
        answerDetails: { $push: '$answerDetails' }, // 将所有answerDetails聚合成数组
        // 添加所有原始字段到分组结果中
        root: { $first: '$$ROOT' }
      })
      .replaceRoot({
        newRoot: $.mergeObjects(['$root', { answerDetails: '$answerDetails' }]) // 合并原始文档与answerDetails数组
      })
      .project({
        root: 0, // 排除中间用于处理的root字段
        'answerProcessed': 0 // 排除中间用于处理的answerProcessed字段
        // 可能还需要排除其它不需要的字段
      })
      .end();

    return { result: result.list }; // 返回聚合操作的结果
  } catch (e) {
    console.error(e);
    return { error: e, errMsg: '查询失败' };
  }
}
